package com.ynkbny.util;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ynkbny.domain.User;
import com.ynkbny.mapper.UserMapper;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * ClassName: UserRoleUtil
 * Package: com.ynkbny.util
 * Description:
 *
 * @Author 小雄
 * @Create 2024/5/11 17:06
 * @Version 1.0
 */

@Component
public class UserRoleUtil<T>{
    @Resource
    private UserMapper userMapper;

    /**
     * 根据登录用户角色权限控制用户查看数据范围
     *
     * @param pageParam
     * @param queryWrapper
     * @param baseMapper
     * @return
     */
    public Page<T> getPageList(Page<T> pageParam, QueryWrapper<T> queryWrapper, BaseMapper<T> baseMapper){
        //获取当前登录用户信息
        User user= (User) Objects.requireNonNull(RequestContextHolder.getRequestAttributes()).getAttribute("user", RequestAttributes.SCOPE_REQUEST);
        String roleId= Objects.requireNonNull(user).getRoleId();
        Page<T> pageList = null;
        //  roleId=1 普通用户
        if (roleId.equals("1")){
            //查找该企业的信息
            pageList=baseMapper.selectPage(pageParam,queryWrapper.eq("enterprise_code",user.getUserName()));
        }else if(roleId.equals("4")){
            //roleId=4 企业管理员 显示名下所有企业相关信息；
            //根据up_id查找该企业管理员下所有的普通用户user_name(企业社会信用代码)
            List<User> list=userMapper.getList(user.getId());
            List<String> enterpriseCodes = list.stream()
                    .map(User::getUserName)
                    .collect(Collectors.toList());
            if (!enterpriseCodes.isEmpty()){
                //根据企业社会信用代码集合 查找出 该企业管理员下所有企业的信息
                //有权访问的企业数据信息
                queryWrapper.in("enterprise_code",enterpriseCodes);
                pageList=baseMapper.selectPage(pageParam,queryWrapper);
            }else{
                //如果list为空 则返回一个空的分页对象
                pageList=new Page<>();
            }
        }else{
            //超级管理员 查看所有企业信息
            pageList=baseMapper.selectPage(pageParam,queryWrapper);
        }
        return pageList;
    }

    /**
     * 根据登录用户角色控制可管理的用户信息
     *
     * @param pageParam
     * @param queryWrapper
     * @param baseMapper
     * @return
     */
    public Page<T> getUserPageList(Page<T> pageParam, QueryWrapper<T> queryWrapper, BaseMapper<T> baseMapper){
        //获取当前登录用户信息
        User user= (User) Objects.requireNonNull(RequestContextHolder.getRequestAttributes()).getAttribute("user", RequestAttributes.SCOPE_REQUEST);
        String roleId= Objects.requireNonNull(user).getRoleId();
        Page<T> pageList = null;
        if(roleId.equals("4")){
            //roleId=4 企业管理员 显示名下所有企业相关信息；
            //根据up_id查找该企业管理员下所有的普通用户user_name(企业社会信用代码)
            List<User> list=userMapper.getList(user.getId());
            List<String> userNameList = list.stream()
                    .map(User::getUserName)
                    .collect(Collectors.toList());
            if (!userNameList.isEmpty()){
                //有权访问的用户信息
                queryWrapper.in("user_name",userNameList);
                pageList=baseMapper.selectPage(pageParam,queryWrapper);
            }else{
                //如果list为空 则返回一个空的分页对象
                pageList=new Page<>();
            }
        }else{
            //超级管理员 查看所有企业信息
            pageList=baseMapper.selectPage(pageParam,queryWrapper);
        }
        return pageList;
    }

    /**
     * 对于多表查询：根据用户角色构造查询条件
     *
     * @param queryWrapper
     * @return
     */
    public QueryWrapper<T> getQueryWrapper(QueryWrapper<T> queryWrapper) {
        //获取当前登录用户信息
        User user= (User) Objects.requireNonNull(RequestContextHolder.getRequestAttributes()).getAttribute("user", RequestAttributes.SCOPE_REQUEST);
        String roleId= Objects.requireNonNull(user).getRoleId();
        //  roleId=1 普通用户
        if (roleId.equals("1")){
            queryWrapper.eq("enterprise_code",user.getUserName());
        }else if(roleId.equals("4")){
            //roleId=4 企业管理员 显示名下所有企业相关信息；
            //根据up_id查找该企业管理员下所有的普通用户user_name(企业社会信用代码)
            List<User> list=userMapper.getList(user.getId());
            List<String> userNameList = list.stream()
                    .map(User::getUserName)
                    .collect(Collectors.toList());
            if (!userNameList.isEmpty()){
                //根据企业社会信用代码集合 查找出 该企业管理员下所有企业的信息
                //有权访问的企业数据信息
                queryWrapper.in("enterprise_code",userNameList);
            }else {
                try {
                    throw new Exception();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }else{
            return queryWrapper;
        }
        return queryWrapper;
    }
}
